#pragma once
#include <string>
#include <cstddef> 
#include <odb/nullable.hxx>
#include <odb/core.hxx>

// odb -d mysql --std c++11 --generate-query --generate-schema --profile boost/date-time user.hxx
namespace xchat
{

#pragma db object table("user")
class User
{
public:
    User() {}
    //用户名--新增id -- 用户ID 昵称 密码
    User(const std::string &user_id, const std::string &nickname, const std::string &password)
        : _user_id(user_id), _nickname(nickname), _password(password) {}
    //手机号--新增用户 --用户id 手机号 随机昵称
    User(const std::string &user_id, const std::string &phone)
        : _phone(phone), _user_id(user_id), _nickname(user_id) {}
    
    std::string user_id()  { return _user_id; }
    void user_id(const std::string &val)  { _user_id = val; }
    
    odb::nullable<std::string> nickname()  
    { 
        if(_nickname.null()) return odb::nullable<std::string>("");
        return _nickname;
    }
    void nickname(const std::string &val)  { _nickname = val; }

    odb::nullable<std::string> description()
    {
        if(_description.null()) return odb::nullable<std::string>("");
        return _description;
    }
    void description(const std::string &val)  { _description = val; }

    odb::nullable<std::string> password()
    {
        if(_password.null()) return odb::nullable<std::string>("");
        return _password;
    }
    void password(const std::string &val)  { _password = val; }

    odb::nullable<std::string> phone() 
    {
        if(_phone.null()) return odb::nullable<std::string>("");
        return _phone;
    }
    void phone(const std::string &val)  { _phone = val; }

    odb::nullable<std::string> avatar_id() 
    {
        if(_avatar_id.null()) return odb::nullable<std::string>("");
        return _avatar_id;
    }
    void avatar_id(const std::string &val)  { _avatar_id = val; }

private:
    friend class odb::access;

    #pragma db id auto
    unsigned long _id;
    #pragma db type("varchar(64)") index unique
    std::string _user_id;
    #pragma db type("varchar(64)")  index unique
    odb::nullable<std::string> _nickname;   //用户昵称不一定存在
    odb::nullable<std::string> _description;   //用户签名
    #pragma db type("varchar(64)")
    odb::nullable<std::string> _password;   //用户密码
    #pragma db type("varchar(64)") index unique
    odb::nullable<std::string> _phone;   //用户手机号
    #pragma db type("varchar(64)") 
    odb::nullable<std::string> _avatar_id;   //用户头像id

};
}